package com.basic.common.utils;

import java.lang.reflect.Field;

/**
 * 实体类操作工具类，提供关于类和字段的反射操作功能。
 *
 * @author zhaoxy_jn@163.com
 */
public class ClassUtils {

    /**
     * 递归获取类或其超类中的指定字段。
     *
     * @param clazz 查找字段的类
     * @param fieldName 字段名
     * @return 字段对象
     * @throws NoSuchFieldException 如果字段不存在
     */
    public static Field getField(Class<?> clazz, String fieldName) throws NoSuchFieldException {
        try {
            // 尝试获取当前类中声明的字段
            return clazz.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            // 如果字段在当前类中不存在，尝试在其超类中查找
            // 如果在当前类中找不到，尝试从其超类中查找
            Class<?> superClass = clazz.getSuperclass();
            if (superClass != null) {
                // 如果超类不为空，则递归调用本方法查找字段
                return getField(superClass, fieldName);
            } else {
                // 如果超类为空，说明已经到达Object类，仍然未找到字段，则抛出异常
                // 如果到达Object类仍没找到，则抛出异常
                throw new NoSuchFieldException("Field '" + fieldName + "' not found in class " + clazz.getName() + " or its superclasses.");
            }
        }
    }

}
